16.3 Calibració sensor 0159 (MG811).
Calibratge del sensor SEN0159 amb el sensor SEN0220 (NDIR)
El sensor SEN0159 ja hem vist que mesura CO2 en l'interval 0 - 10000 ppm CO2 de forma logarítmica mentre el SEN0220 mesura CO2 en l'interval 0 - 50000 ppm CO2.
Per calibrar el sensor SEN0159 amb el sensor SEN0220 farem el muntatge següent:
Introduirem els dos sensors dins d'un dessecador de vidre fent passar els cables pel tap de plàstic perforat, d'aquesta forma l'aire que anem a mesurar estarà aïllat del ambient /aula on estem nosaltres.
Per obtindre el punt de calibrat baix ventilem l'aula 60 minuts amb el programa engegat i agafem les mesures com bones a partir de l'hora, en eixe moment posem la tapa al dessecador i mirem l'hora per cercar les mesures a la targeta MicroSD.
Mira el muntatge per al calibratge del punt baix.
Els punt de calibratge una vegada convertits del format *.txt al *.csv, una vegada cambiades les cometes americanes per cometes europees ens permet importar el fitxer *csv al libreoffice calc i obtenim els valors següents:
Per obtindre el punt de calibrat alt ventilem l'aula 60 minuts amb el programa engegat i agafem les mesures com bones a partir de l'hora, en eixe moment introduïm l'erlenmeyer on posem 150 ml d'aigua , 40 ml d'àcid acètic pur i un guix/clarió de pissarra per generar CO2, posem la tapa al dessecador i mirem l'hora per cercar les mesures a la targeta MicroSD. Agafem les lectures més properes a 10000 ppm de CO2 mesurades amb el sensor SEN0220.
Mira el nostres esquema de muntatge per al punt de calibrat alt.
Mira les que hem obtès nosaltres:
Fem ús de la relació
Suposem que FEM1= 0.2371 V que per a aquest valor correspon una concentració de CO2 mesurada amb el espectrofotòmetre d'IR SEN0220 de 785.19266 ppmCO2 i que FEM2=0.0525 V que per a aquest valor correspon una concentració de CO2 de 9731.75 ppmCO2 , llavors calcularem el valors de la recta de regressió logarítmica següent:
El programa amb el qual hem fet aquesta calibració és:
// Calibrat del sensor SEN0159 amb el sensor 0220
// Per fer aquest programa s'han gastat les fonts que segueixen
// Font1: http://playground.arduino.cc/Main/DHT11Lib
// Font2: https://www.arduino.cc/en/Tutorial/Files
// Font3 = https://www.dfrobot.com/wiki/index.php/CO2_Sensor_SKU:SEN0159
// Font3= https://www.dfrobot.com/wiki/index.php/Infrared_CO2_Sensor_0-50000ppm_SKU:_SEN0220
// created Nov 2010 by David A. Mellis
// modified 9 Apr 2012 by Tom Igoe
// Created Tiequan Shao: tiequan.shao@sandboxelectronics.com
// Created Peng Wei: peng.wei@sandboxelectronics.com
// Modified by Leff from DFRobot, leff.wei@dfrobot.com, 2016-4-21, make the algorithm clearer to user
// Created at 2016-6-6 by lg.gang(lg.gang@qq.com)
// Modificat el 1 de març de 2017 per Carles Ferrando
#include <SD.h>
File myFile;
#include <Time.h>
//Definim la data i hora per configurar el rellotge
int hora;
int minut;
int segon;
int dia;
int mes;
int any;
/************************Constants del programa*********|***************************/
int MG_PIN = 0 ; //Defineix el port analogic per mesurar la lectura de voltatge (CO2)
int DC_GAIN = 8.5 ; // Defineix el guany del amplificador operacional
int READ_SAMPLE_TIMES = 5 ; //Defineix el nombre de mostres que es prendran en funcionament normal
int READ_SAMPLE_INTERVAL = 50 ; //defineix l'interval de temps (en milisegons) entre cada mostra
/**********************Valors que cal calibrar**********************************/
//Aquests valors difereixen de sensor a sensor. L'usuari ha de determinar aquest valor.
float ZERO_POINT_X = 2.608; // lg405.91=2.608, el punt inicial a l'eix X de la corba
float ZERO_POINT_VOLTAGE = 0.14; //defineix la eixida del sensor en Volts quan la concentració de CO2 es 405.91 PPM
float MAX_POINT_VOLTAGE = 0.265 ; //defineix la eixida del sensor en volts quan la concentració de CO2 és 10.000 PPM
float MAX_POINT_X = 4 ; //Log10000 = 4 el punt final de la corba logaritmica
long valorRealCO2 ;
float lecturaSensorCO2;// lecturaSensorCO2 =volts/DC_GAIN el voltatge esta amplificat DC_GAIN i ens cal el voltatge sense amplificar per fer calculs
float LConcentracioCO2; // log(CO2 en ppm)
float ConcentracioCO2 ; // CO2 en ppm
float volts; //lectura amplificada del voltatge
#include <SoftwareSerial.h>
SoftwareSerial mySerial(5, 6); // RX, TX
unsigned char hexdata[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; //Read the gas density command /Don't change the order
void setup()
{
Serial.begin(9600);
while (!Serial) {
}
mySerial.begin(9600);
//setTime(hr,min,sec,day,month,yr); // CAL POSAR L-HORA REAL I LA DATA AL COMENÇAR LA CLASSE A LA RATLLA DE SOTA
setTime(9,23 ,00,13,3,2017); // CAL POSAR L-HORA REAL I LA DATA AL COMENÇAR LA CLASSE
Serial.println("IES Gabriel Ciscar Aula Tecnologia 3");
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(10)) {
Serial.println("Initcializacio feta!");
return;
}
Serial.println("initcializacio feta.");
if (SD.exists("dades.txt")) {
Serial.println("dades.txt existeix.");
}
else {
Serial.println("dades.txt no existeix.");
}
// Obre un fitxer nou i tanca'l de forma immediata:
Serial.println("Creant dades.txt...");
myFile = SD.open("dades.txt", FILE_WRITE);
myFile.close();
// Comprova si el fitxer existeix:
if (SD.exists("dades.txt")) {
Serial.println("dades.txt existeix.");
}
else {
Serial.println("dades.txt no existeix.");
}
}
void loop()
{
// Actualitza l_hora a partir de l_hora configurada al setTime
time_t t = now();
hora = hour(t);
minut= minute(t);
segon= second(t);
dia = day(t);
mes= month(t);
any= year(t);
// Llegeix les dades
volts = MGRead(MG_PIN);
lecturaSensorCO2 =volts/DC_GAIN ;
//LConcentracioCO2 = (ZERO_POINT_X+((MAX_POINT_X-ZERO_POINT_X)/(MAX_POINT_VOLTAGE -ZERO_POINT_VOLTAGE))*(lecturaSensorCO2-ZERO_POINT_VOLTAGE));
// ConcentracioCO2 = pow(10, LConcentracioCO2);
//Serial.println("Volts llegits= ");
//Serial.println(volts);
// Serial.println("Volts corregits= ");
// Serial.println(lecturaSensorCO2);
//Bloc CO2 especytrometre
mySerial.write(hexdata,9);
delay(500);
for(int i=0,j=0;i<9;i++)
{
if (mySerial.available()>0)
{
long hi,lo, CO2;
int ch=mySerial.read();
if(i==2){ hi=ch; } //High concentration
if(i==3){ lo=ch; } //Low concentration
if(i==8) {
CO2=hi*256+lo; //CO2 concentration
valorRealCO2 = CO2;
Serial.print("CO2 concentration: ");
Serial.print(CO2);
Serial.println("ppm");
}
}
} //Final bloc espectrometre
// Mostra les dades pel terminal serie
File dataFile = SD.open("dades.txt", FILE_WRITE);
Serial.print(dia);
Serial.print("/");
Serial.print(mes);
Serial.print("/");
Serial.print(any);
Serial.print(" ");
Serial.print(hora);
Serial.print(":");
Serial.print(minut);
Serial.print(":");
Serial.print(segon);
Serial.print(" ");
Serial.print(";");
Serial.print(" ");
Serial.print(lecturaSensorCO2);
Serial.print(" ");
Serial.print(";");
Serial.print(" ");
Serial.println(valorRealCO2 );
//Guarda les dades a la targeta SD
if (dataFile) {
dataFile.print(dia);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(mes);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(any);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(hora);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(minut);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(segon);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(lecturaSensorCO2);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.println(valorRealCO2);
dataFile.close();
}
else {
Serial.println("Error en obrir el fitxer");
// if the file didn't open, do something here
}
}
/***************************** MGRead *********************************************
Input: mg_pin - analog channel
Output: output of SEN-000007
Remarks: This function reads the output of SEN-000007
************************************************************************************/
float MGRead(int mg_pin) {
int i;
float v = 0;
for (i = 0; i < READ_SAMPLE_TIMES; i++) {
v += analogRead(mg_pin);
delay(READ_SAMPLE_INTERVAL);
}
v = (v / READ_SAMPLE_TIMES) * 5 / 1024 ;
return v;
}
El programa també el tens en dins del zip CalibracioCO2.zip (zip - 2824 B).
Llicenciat sota la Llicència Creative Commons Reconeixement NoComercial CompartirIgual 3.0